package com.gjw.designpattern.bulider;

/**
 * 建造者模式
 * 四种角色：
 * 1.产品类
 * 2.抽象建造者
 * 3.具体建造者
 * 4.指挥者
 *
 * 指挥者（Director）直接和客户（Client）进行需求沟通；
 * 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求（Builder）；
 * 将各个部件的建造请求委派到具体的建造者（ConcreteBuilder）；
 * 各个具体建造者负责进行产品部件的构建；
 * 最终构建成具体产品（Product）。
 */
public class Client {

    public static void main(String[] args) {
        //客户要个联想电脑
        Computer lx = getComputer(new LenovoBuilder());
        System.out.println("联想电脑：");
        System.out.println("电脑cpu："+lx.getCpu().toString());
        System.out.println("电脑主板："+lx.getMainBoard().toString());
        System.out.println("电脑内存条："+lx.getRam().toString());

        //又想要个戴尔电脑
        Computer dell = getComputer(new DellBuilder());
        System.out.println("戴尔电脑：");
        System.out.println("电脑cpu："+dell.getCpu().toString());
        System.out.println("电脑主板："+dell.getMainBoard().toString());
        System.out.println("电脑内存条："+dell.getRam().toString());

        //---------------------建造者模式另一用途
        //要一个联想电脑
        Computer computer = new Computer(new Cpu("联想","cpu"),new RAM("联想","ram"),new MainBoard("联想","mainBoard"));
        System.out.println("通过构造来创建联想电脑：");
        System.out.println("电脑cpu："+computer.getCpu().toString());
        System.out.println("电脑主板："+computer.getMainBoard().toString());
        System.out.println("电脑内存条："+computer.getRam().toString());

        NewComputer newComputer = new NewComputer.Builder()
                .cpu(new Cpu("联想","lxCpu"))
                .mainBoard(new MainBoard("联想","lxMainBoard"))
                .ram(new RAM("联想","lxRam"))
                .getComputer();

        System.out.println("通过建造者模式来创建联想电脑：");
        System.out.println("电脑cpu："+newComputer.getCpu().toString());
        System.out.println("电脑主板："+newComputer.getMainBoard().toString());
        System.out.println("电脑内存条："+newComputer.getRam().toString());
    }


    public static Computer getComputer(Builder builder){
        Director director = new Director(builder);
        return director.createComputer();
    }
}
